package com.smzd.framework.core.actions;

import java.util.Map;

import org.springframework.validation.BindingResult;

import com.smzd.core.domain.IntIdEntity;
import com.smzd.framework.core.business.IFGService;
import com.smzd.framework.utils.db.RPage;

public abstract class AbstractController<E extends IntIdEntity> extends AbstractCommonController<E> {

    protected abstract IFGService<E> getService();

    /**
     * 默认的实现。必须用户登录，直接导航到单数页面。<br>
     * 提供view资源位置。
     */
    public String toAddPage(Map<String, Object> model, E elem, BindingResult result) throws Exception {
        model.put("item", elem);
        return toAddPage(elem, getViewParameter(model));
    }

    /**
     * 默认的实现。必须用户登录，完成数据插入，返回成功信息，并插入的记录的ID。<br>
     * 提供Ajax的Json数据返回格式。
     * 
     * @throws Exception
     */
    public String postAddData(Map<String, Object> model, E elem, BindingResult result) throws Exception {
        return postAddData(elem);
    }

    /**
     * 默认的实现。必须用户登录，直接导航到复数页面。<br>
     * 提供view资源位置。<br>
     * 一般是模块的入口。
     */
    public String toListPage(Map<String, Object> model, E elem, BindingResult result) throws Exception {
        model.put("item", elem);
        return toListPage(getViewParameter(model));
    }

    /**
     * 默认的实现。必须用户登录，返回请求的数据列表。<br>
     * 提供Ajax的Json数据返回格式。
     * 
     * @throws Exception
     */
    public String getListData(Map<String, Object> model, RPage<E> page, BindingResult result) throws Exception {
        getService().getElemsByPage(page);
        return page.toFlexiGridJsonString(getService().getConverter());
    }

    /**
     * 默认的实现。必须用户登录，直接导航到单数页面。给出了请求的数据实体。<br>
     * 提供view资源位置。
     */
    public String toEditPage(Map<String, Object> model, E elem, BindingResult result) throws Exception {
        model.put("item", elem);
        return toEditPage(getViewParameter(model));
    }

    /**
     * 默认的实现。必须用户登录，完成数据更新，返回成功信息，并当前记录的ID。<br>
     * 提供Ajax的Json数据返回格式。
     * 
     * @throws Exception
     */
    public String postEditData(Map<String, Object> model, E elem, BindingResult result) throws Exception {
        return postEditData(elem);
    }

    /**
     * 默认的实现。必须用户登录，完成数据删除，返回成功信息，并当前记录的ID。<br>
     * 提供Ajax的Json数据返回格式。
     * 
     * @throws Exception
     */
    public String postRemoveData(Map<String, Object> model, E elem, BindingResult result) throws Exception {
        return postRemoveData(elem);
    }

    /**
     * 进入传统分页页面，视图总将会出现page对象，内含分页数据
     * 
     * @param model
     * @param page
     * @param result
     * @return
     */
    public String toStaticListPage(Map<String, Object> model, RPage<E> page, BindingResult result) {
        getService().getElemsByPage(page);
        model.put("page", page);
        return getListView(getViewParameter(model));
    }

}
